// 引入日志系统头文件
#include "../logs/hsllog.hpp"

// 日志测试函数
void loggerTest(const std::string &logger_name) {
    // 1. 获取指定名称的日志器
    hsl_log::Logger::ptr lp = hsl_log::getLogger(logger_name);
    assert(lp.get()); // 验证日志器是否获取成功
    
    // 2. 使用FATAL级别打印分隔线（通过默认根日志器）
    LOGF("------------example--------------------");
    
    // 3. 测试不同级别的日志输出（直接调用日志器方法）
    lp->debug("%s", "logger->debug");   // DEBUG级别
    lp->info("%s", "logger->info");     // INFO级别
    lp->warn("%s", "logger->warn");     // WARN级别
    lp->error("%s", "logger->error");   // ERROR级别
    lp->fatal("%s", "logger->fatal");   // FATAL级别
    
    // 4. 测试通过宏函数输出日志（会自动添加文件和行号信息）
    LOG_DEBUG(lp, "%s", "LOG_DEBUG");   // 使用DEBUG宏
    LOG_INFO(lp, "%s", "LOG_INFO");     // 使用INFO宏
    LOG_WARN(lp, "%s", "LOG_WARN");     // 使用WARN宏
    LOG_ERROR(lp, "%s", "LOG_ERROR");   // 使用ERROR宏
    LOG_FATAL(lp, "%s", "LOG_FATAL");   // 使用FATAL宏
    
    // 5. 结束分隔线
    LOGF("---------------------------------------");
    
    // 6. 性能测试：连续输出10万条ERROR日志
    std::string log_msg = "hello HSL-";
    size_t fsize = 0;
    size_t count = 0;
    while(count < 100000) {
        std::string msg = log_msg + std::to_string(count++);
        lp->error("%s", msg.c_str());  // 输出带编号的日志消息
    }
}

// 功能测试函数
void functional_test() {
    // 1. 创建全局日志构建器
    hsl_log::GlobalLoggerBuilder::ptr lbp(new hsl_log::GlobalLoggerBuilder);
    
    // 2. 配置日志器属性
    lbp->buildLoggerName("all_sink_logger");                     // 设置日志器名称
    lbp->buildFormatter("[%d][%c][%f:%l][%p] %m%n");            // 设置日志格式
    lbp->buildLoggerLevel(hsl_log::LogLevel::value::DEBUG);      // 设置日志级别
    lbp->buildSink<hsl_log::StdoutSink>();                      // 添加控制台输出
    lbp->buildSink<hsl_log::FileSink>("./logfile/sync.log");       // 添加普通文件输出
    lbp->buildSink<hsl_log::RollSink>("./logfile/roll-", 1024 * 1024); // 添加滚动日志(单个文件最大1MB)
    lbp->buildLoggerType(hsl_log::Logger::Type::LOGGER_ASYNC);   // 设置为异步日志器
    
    // 3. 构建日志器（会自动注册到日志管理器）
    lbp->build();
    
    // 4. 测试新建的日志器
    loggerTest("all_sink_logger");
}

// 主函数
int main(int argc, char *argv[])
{
    // 执行功能测试
    functional_test();
    return 0;
}